/*
 * archivo.h
 *
 *  Created on: 01/11/2011
 *      Author: utn_so
 */

#ifndef ARCHIVO_H_
#define ARCHIVO_H_

#include <string.h>

#define MAX_LONG_FILENAME 255
//#define BLOQPERCACHE 4

typedef struct sArchivo ARCHIVO;

//Archivo
ARCHIVO *nuevoNodoArchivo();
ARCHIVO *buscarNodoArchivoXCluster(int32_t numCluster);
ARCHIVO *buscarNodoArchivoXFH(uint64_t fh);
ARCHIVO *creaNodoArchivo();


//Cache
int32_t cache_archivo_crear(struct sArchivo *archivo);
void cache_archivo_flush( ARCHIVO *archivo);
int32_t cache_archivo_leer(ARCHIVO *archivo, int32_t numCluster, unsigned char *contenidoCluster);
void cache_archivo_escribir(ARCHIVO *archivo, int32_t numCluster, unsigned char *contenidoCluster);
int32_t buscar_bloque(ARCHIVO *archivo, int32_t numCluster);
int32_t obtener_bloque_para_escribir(ARCHIVO *archivo, int32_t numCluster);
void cache_archivo_cerrar(ARCHIVO *archivo);
uint32_t tiempoEnMilisegundos();

//Structs

struct bloqueCache
{
	int32_t numCluster;
	unsigned char data[4097];
	uint32_t tiempo;
	short int modificado;
};


struct sArchivo
{
	uint64_t 				fh;//FileHandle
	int32_t					aperturas_simultaneas;
	unsigned long			parentcluster;
	unsigned long			startcluster;
	unsigned long			bytenum;
	uint32_t				size;
	int						filelength_changed;
	char					path[MAX_LONG_FILENAME];
	unsigned char			shortfilename[11];

	//Clusters Encadenados del Archivo
	struct cluster 			*listaClusters;

	//Semaforo
	pthread_mutex_t semaforoCache;

	//Cache
	struct bloqueCache		*cache;

	// Cluster Lookup
	//struct cluster_lookup	last_fat_lookup;

	// Read/Write sector buffer
	//struct sector_buffer	file_data;

	// File fopen flags
	unsigned char			flags;
	#define FILE_READ	(1 << 0)
	#define FILE_WRITE	(1 << 1)
	#define FILE_APPEND	(1 << 2)
	#define FILE_BINARY	(1 << 3)
	#define FILE_ERASE	(1 << 4)
	#define FILE_CREATE	(1 << 5)

	struct sArchivo			*sig;
} ;




#endif /* ARCHIVO_H_ */
